﻿// test_gbk_utf8.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include<string>
#include<windows.h>
using namespace std;

string UTF8ToGBK(const char* data)
{
    string utf8 = "";

    //1.统计转换后的字节数
    int len = MultiByteToWideChar(
         CP_UTF8,   //转换的格式
         0,         //默认的转换方式
         data,      //输入的字节
        -1,         //输入的字符串大小，-1表示找\0结束
        0,          //输出
        0           //输出的空间大小
    );
    if (len <= 0)
    {
        return utf8;
    }
    //2.UTF8转为unicode win utf16
    wstring udata;
    udata.resize(len);
    MultiByteToWideChar(CP_UTF8, 0, data, -1, (wchar_t*)udata.data(), len);

    //3.unicode转换为GBK
    len = WideCharToMultiByte(CP_ACP, 0, (wchar_t*)udata.data(), -1, 0, 0,
        0,  //失败默认替代字符
        0   //是否使用默认替代
    );
    if (len <= 0)
    {
        return utf8;
    }
    utf8.resize(len);
    WideCharToMultiByte(CP_ACP, 0, (wchar_t*)udata.data(), -1, (char*)utf8.data(), len, 0, 0);

    return utf8;
}
string GBKToUTF8(const char* data)
{
    string gbk = "";

    //1.统计转换后的字节数
    int len = MultiByteToWideChar(
        CP_ACP,   //转换的格式
        0,         //默认的转换方式
        data,      //输入的字节
        -1,         //输入的字符串大小，-1表示找\0结束
        0,          //输出
        0           //输出的空间大小
    );
    if (len <= 0)
    {
        return gbk;
    }
    //2.GBK转为unicode win utf16
    wstring udata;
    udata.resize(len);
    MultiByteToWideChar(CP_ACP, 0, data, -1, (wchar_t*)udata.data(), len);

    //3.unicode转换为UTF8
    len = WideCharToMultiByte(CP_UTF8, 0, (wchar_t*)udata.data(), -1, 0, 0,
        0,  //失败默认替代字符
        0   //是否使用默认替代
    );
    if (len <= 0)
    {
        return gbk;
    }
    gbk.resize(len);
    WideCharToMultiByte(CP_UTF8, 0, (wchar_t*)udata.data(), -1, (char*)gbk.data(), len, 0, 0);

    return gbk;
}

int main()
{
    std::cout << "Hello World!\n";
    cout << u8"UTF8转GBK" << endl;
    //测试
    cout << UTF8ToGBK(u8"UTF8转GBK") << endl;
    //测试
    string utf8 = GBKToUTF8("测试GBK转utf8再转为GBk");
    cout << "utf8 = " << utf8 << endl;
    cout << UTF8ToGBK(utf8.c_str()) << endl;

}


